Skip to main content

用户注册 验证 验证码 的正确逻辑

公司用户注册和找回密码有关验证码的部分做的不正确。

于是自己思考了一下做法,决定把这个思路放到自己开发的CMS系统里面。

下面是自己设计出来的,认为标准的做法。

一、用户注册
-------------------
|手机号/邮箱 |
--------------------|
| 发验证码 |
--------------------|
|密码 |
--------------------|
|提交|

两个事件
1.发送短信 send_sms
2.发送邮件 send_mail

创建两个函数
1.添加验证码函数 insert_verification_code($name,$type_id = 1)
2.匹配验证码函数 matching_verification_code($name,$code,$type_id = 1,$minute = 0)

function insert_verification_code($name,$type_id = 1)
{
$code = rand(100000,900000);
$data = array();
$data['name'] = trim($name);
$data['code'] =$code;
$data['add_time'] = gmtime();
$data['type_id'] = trim($type_id);

//添加
return $GLOBALS['db']->autoExecute( $GLOBALS['ecs']->table("user_verification_code"),$data);
}

/**
* 检查用户验证码是否正确
* 正确返回真,错误返回假
*/
function matching_verification_code($name,$code,$type_id = 1,$minute=0)
{
$where = " ";
$new = gmtime();
//
if( !empty($minute) && $minute>0 )
{
$minute = $minute*60;
$where .= " AND `add_time` >= '".$new-$minute."'";
}
//
$sql = "SELECT `code` FROM ".$GLOBALS['ecs']->table('user_verification_code') .
" WHERE `name` = '$name' AND type_id = '$type_id' $where ORDER BY add_time DESC LIMIT 1" ;
$data = $GLOBALS['db']->getOne($sql);

if( $code == $data)
{
return true;
}
else
{
return false;
}
}

数据字典

|用户验证码|
--------------------------
user_verification_code
--------------------------
name
code
type_id
add_time

|验证码类型|
-----------------------
verification_type
-----------------------
type_id 1.注册验证码 2.找回密码验证码
type_name
add_time


二、找回密码
1、输入手机号/邮箱 (检测用户是否存在,存在则匹配类型,并发送验证码)
2、输入验证码和密码 (重新发送验证码,ajax提交,匹配验证码是否正确,正确则登陆并跳转。错误则给出提示)
3、验证是否正确,正确并登陆。